package co.com.bean.medico;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.MedicoDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.MedicoFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartMedico;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;


@Stateless(mappedName = "ejb/MedicoBean")
public class MedicoBean implements MedicoBeanLocal{
	private MedicoFacadeLocal facade;

	public MedicoBean() {
		facade = DelegateContextEJB.getMedicoFacadeLocal();
	}
	@Override
	public ResponseJson insertarMedico(MedicoDTO medicoDTO) {

		ResponseJson response = new ResponseJson(); 
		try {
			medicoDTO.setFhingreso(new Date());
			medicoDTO.setFhmodificacion(new Date());
			facade.create(Mapper.mapperDtoToSmartMedico(medicoDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico almacenado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico almacenado.");
		} catch (Throwable e) {
			System.err.println("Error insertando el medico -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el medico.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public List<MedicoDTO> consultarAllMedico(){
		List<MedicoDTO> medico = new ArrayList<MedicoDTO>();
		for (SmartMedico entity : facade.findAll()) {
			if(entity.getSmFhretiro() == null){
				medico.add(Mapper.mapperSmartMedicoToDto(entity));
			}
		}

		return medico;
	}

	@Override
	public MedicoDTO consultarMedicoId(MedicoDTO medicoDTO) {
		MedicoDTO medico = new MedicoDTO();
		SmartMedico entity  = facade.find(medicoDTO.getScmedico());
		if(entity != null && entity.getSmFhretiro() == null){
			medico = Mapper.mapperSmartMedicoToDto(entity);
		}
		return medico;
	}

	@Override
	public ResponseJson editMedico(MedicoDTO medico) {
		ResponseJson response = new ResponseJson(); 
		try {
			medico.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartMedico(medico));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico editado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico editado.");
		} catch (Throwable e) {
			System.err.println("Error editando el medico -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el medico.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}

	@Override
	public ResponseJson removeMedico(MedicoDTO medico,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				medico.setFhretiro(new Date());
				medico.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartMedico(medico));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico inactivado.");
			} catch (Throwable e) {
				System.err.println("Error editando el medico -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el medico.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartMedico(medico));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico eliminado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Medico eliminado.");
			} catch (Throwable e) {
				System.err.println("Error eliminando el medico -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el medico.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}

	
}
